#ifndef __AGORA_NETWORK_HOST_H__
#define __AGORA_NETWORK_HOST_H__

/*!
 * \file Host.h
 * \brief Regroupe les outils decrivant une connection de type hote
 */

#ifndef _WIN32
#include <sys/types.h>
#include <sys/socket.h>
#else
#include "winsock2.h"
#endif
#include "Connection.h"

/*! \namespace Network
 * 
 * espace de nommage regroupant les classes et outils necessaires a la gestion des connections reseaux
 */

namespace AgoraCore
{
	/*! \class Host
   * \brief classe representant une connection hote
   *
   *  La classe Guest herite des attributs de la classe Connection et apporte a celle-ci des methodes specifiques a la gestion d'une connection de type invite
   */
	class	Host : public Connection
	{
	public:
		/*!
     *  \brief Constructeur
     *
     *  Constructeur de la classe Host
     *
     */
		Host();
		/*!
     *  \brief Destructeur
     *
     *  Destructeur de la classe Host
     */
		~Host();
		/*!
	*	\brief Initialise la connection
	*	
	*	La methode permet d'initialiser une connection de type hote sur un port donne et une adresse IP. Si aucune adresse n'est fournie la connection sera initialiser sur toute les adresses disponible sur la machine
	*
	*	\param port : Le numero de port sur lequel initialiser la connection
	*	\param address : L'adresse IP sur laquel initialiser la connection
	*	\return Si la methode echoue un code d'erreur est retourne sinon 0 est renvoye
	*/
		unsigned int	Init(unsigned short int port, const std::string& address = "ANYADDR");
		/*!
	*	\brief Ecoute les demandes de connection
	*	
	*	Lance la fonction d'ecoute sur la connection afin d'authoriser des connections entrantes
	*
	*	\param queueLength : La longeur de la liste d'attente des demandes de connections
	*	\return Si la methode echoue un code d'erreur est retourne sinon 0 est renvoye
	*/
		unsigned int	Listen(unsigned int queueLength = 5);
		/*!
	*	\brief Accepte une connection entrante
	*	
	*	Accepte une connection entrante et enregistre ses informations dans l'objet incomingConnection passe en parametre. Celui ci est instancie par la methode
	*
	*	\param incomingConnection : Adresse d'un pointeur sur un objet de type connection
	*	\return Si la methode echoue un code d'erreur est retourne sinon 0 est renvoye
	*/
		unsigned int	Accept(Connection** incomingConnection);
	};
}

#endif
